call 函式,我們會return值回來,把常用的,常重覆的功能寫成function來使用,也可以不傳值(void)回來,通常return值回來,又會繼續往下執行,直到結束,我們應該不會問為什麼會回來,這個動作,回傳值,就會回呼叫的地方,很自然的習慣且接受call完會回來的事實,以組合語言的角度,這是有底層機制在協助的,要借助上一節所提到的堆疊。
jmp在一般語言,好像比較像goto 的語法,和call比較,就是沒有return(返回)。
本篇參考加拿大女教授的youtube教學,Understanding Subroutine Calls at the Machine Level(從機器角度來理解呼叫副程式)http://www.youtube.com/watch?v=XYzXcCASH9M&feature=plcp。
C:\>debug
-a 100
08FA:0100 jmp 200
08FA:0103 call 200
08FA:0106
-t
這時ip的值,從100, 變200, 表示跳到200去了。
很直覺的JUMP, 跳過去。
接著測call的效果。
把ip指標指回call這行,
-r ip
IP 0200 :103
-t
然後執行下一步,
這時有事情發生了,
SP推疊指標發生變化,由FFFE變成FFEC,類似昨天的機制發生了,
這時,
-d ss:fff0
08FA:FFF0 00 00 03 01 00 00 00 02-FA 08 86 73 06 01 00 00
返回的位置,106放入ss堆疊段,返回時, 就接106往下做。
這時ip還是指向200.
我們在200, 做一個RETURN(RET)
-a 200
08FA:0200 ret
08FA:0201
-t
這時ip參考SS堆疊段,SP位置的值,106,再返回。
IP由200變成106。SP也變回FFFE.
而SS堆疊段也改變了。
-d ss:fff0
08FA:FFF0 00 02 00 00 FA 08 00 00-06 01 FA 08 86 73 00 00
小結:這段練習演示了筆者視為理所當然沒有懷疑的呼叫函數機制,沒想到在底層是需要堆疊的配合。
也許大家會提問,傳參數,多個參數,組合語言要放那裏??傳參數物件呢?回傳參數又怎麼表示呢?
筆者隨後會找例子來示範。筆者很期望知道。
今天月結,被課長留了下來,
搞到8點半,坐火車回到家,吃完飯,10點了。
好累,以為退居第5/6線TIPTOP維護人員,
狀況會很少。結果第五天遇到了。
大家加油。